/* myls.c */
#include <sys/stat.h>
#include <stdio.h>

void mode_to_letter(mode_t mode, char *str) /* 将数字形式的 mode 转换为人类可读的字符串形式 */
{
    strcpy(str, "----------"); /* 初始化文件属性数组，strcpy 函数也将\0字符复制到 str 数组中 */
    if (S_ISDIR(mode)) str[0] = 'd';    /* d 代表文件类型为目录 */
    if (S_ISCHR(mode)) str[0] = 'c';    /* 字符设备 */
    if (S_ISBLK(mode)) str[0] = 'b';    /* 块设备 */

    if (mode & S_IRUSR) str[1] = 'r';   /* 用户权限 */
    if (mode & S_IWUSR) str[2] = 'w';
    if (mode & S_IXUSR) str[3] = 'x';

    if (mode & S_IRGRP) str[4] = 'r';   /* 组权限 */
    if (mode & S_IWGRP) str[5] = 'w';
    if (mode & S_IXGRP) str[6] = 'x';

    if (mode & S_IROTH) str[7] = 'r';   /* 其他用户权限 */
    if (mode & S_IWOTH) str[8] = 'w';
    if (mode & S_IXOTH) str[9] = 'x';
}

void do_ls(char *pathname)               /* 读取属性 */
{
    struct stat attr;
    char mode[11]; /* 保存文件属性字符串的数组，其中最高位为文件类型，最后一位为字符串结束符，剩余位为文件的权限模式 */

    if (stat(pathname, &attr) != -1)
    {
        mode_to_letter(attr.st_mode, mode);
        printf("file %s mode is:%s\n", pathname, mode);
    }
    else
    {
        printf("Stat error\n");
        exit(1);
    }
}

int main(int argc, char **argv)
{
    if (argc < 2)
    {
        printf("usage: myls filename\n");
        exit(1);
    }
    do_ls(argv[1]);
}
